home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / basic / inpout.zip / INPOUT.ASM next >
Assembly Source File  |  1991-08-31  |  3KB  |  128 lines

  1. ;InpOut.DLL
  2. ;Inp and Out Visual Basic Keyword replacements
  3. ;Copyright 1991 Crescent Software
  4. ;Written by Jay Munro
  5. ;
  6. .286
  7. .Model Medium
  8. Public Inp,Out,Wep
  9. Extrn UnlockSegment:Proc        ;use LibW.LIB from Win SDK
  10. Extrn LocalInit:Proc
  11.  
  12. WinProlog Macro
  13.   Push DS                       ;useless setup code
  14.   Pop  AX
  15.   Nop
  16.   Inc  BP                       ;adjust BP
  17.   Push BP
  18.   Mov  BP,SP                    ;set up stack frame
  19.   Push DS
  20.   Mov  DS,AX
  21. EndM
  22.  
  23. WinEpilog Macro
  24.   Dec  BP
  25.   Dec  BP
  26.   Mov  SP,BP
  27.   Pop  DS
  28.   Pop  BP
  29.   Dec  BP
  30. EndM
  31.  
  32. .Data
  33.   Required_Data_Header DB 16 dup (?)     ;as required by Windows for .ASM Dlls 
  34.  
  35. INIT_TEXT  SEGMENT BYTE PUBLIC 'CODE'
  36. Assume CS:INIT_TEXT
  37.  
  38. LibEntry Proc Far
  39.         WinProlog
  40.  
  41.         push    di               ; handle of the module instance
  42.         push    ds               ; library data segment
  43.         push    cx               ; heap size
  44.  
  45.         ; if we have some heap then initialize it
  46.         jcxz    CallMain         ; jump if no heap specified
  47.  
  48.         ; call the Windows function LocalInit() to set up the heap
  49.         ; LocalInit((LPSTR)start, WORD cbHeap);
  50.  
  51.         xor     ax,ax
  52.         Push    DS
  53.         Push    AX
  54.         Push    CX
  55.         Call    LocalInit
  56.         Or      ax,ax            ; did it do it ok ?
  57.         Jz      error            ; quit if it failed
  58.  
  59.         ; invoke the asm routine to do any special initialization
  60.  
  61. CallMain:
  62.         Call Far Ptr   LibMain          ; invoke the startup routine (result in AX)
  63.         Jmp short exit           ; LibMain is responsible for stack clean up
  64.  
  65. error:
  66.         pop     cx
  67.         pop     ds
  68.         pop     di
  69.  
  70. exit:
  71.         WinEpilog
  72.         Ret
  73. LibEntry EndP
  74. INIT_TEXT EndS
  75.  
  76. .Code
  77.  
  78. ;  Libmain gets these parameters
  79. ;    parmW hInstance              ;handle [bp+14]
  80. ;    parmW hDataSeg               ;word   [bp+12]
  81. ;    parmW cbHeapSize             ;word   [bp+10]
  82.  
  83. LibMain Proc Far
  84.    WinProlog                    ;windows prolog code
  85.    Push -1                      ;unlock data segment (just in case)
  86.    Call UnlockSegment
  87.    Mov  AX,1                    ;return a 1 to caller
  88.    WinEpilog                    ;windows epilog code
  89.    Ret 6                       ;3 variables (6 bytes)
  90.  
  91. LibMain EndP
  92.  
  93. Wep Proc Far
  94.    WinProlog
  95.    Mov  AX,1
  96.    WinEpilog
  97.    Ret
  98. Wep EndP
  99.  
  100. ;Declare Function Inp Lib "InpOut.DLL" (Port%) as Integer
  101. ;PortNumb% = &h378
  102. ;PortValue% = Inp(PortNumb%)
  103.  
  104. Inp Proc Far
  105.    WinProlog                    ;standard prolog macro
  106.    Mov   DX,[BP+6]              ;load DX with port to check out
  107.    In    AL,DX                  ;input a byte    
  108.    Xor   AH,AH                  ;clear high byte for return in AX
  109.    WinEpilog                    ;standard epilog macro
  110.    Ret 2
  111. Inp EndP
  112.  
  113. ;Declare Sub Out Lib "InpOut.DLL" (Port%,Value%)
  114. ;PortNumb% = &h378                      ;for example only, don't try this
  115. ;Value% = 65
  116. ;Out PortNumb%,Value%
  117.  
  118. Out Proc Far    ;Warning errors can be ignored!
  119.    WinProlog                    ;standard prolog macro
  120.    Mov  AL,[BP+6]               ;get data value into AL (bytes only)
  121.    Mov  DX,[BP+8]               ;get port value into DX
  122.    Out  DX,AL                   ;output the byte
  123.    WinEpilog                    ;standard epilog macro
  124.    Ret 4                        ;return clearing 4 bytes off stack
  125. Out EndP
  126.  
  127. End
  128.